/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufrn.dca.scontrol.control;

import java.util.Vector;

/**
 *
 * @author Marco Olimpio
 */
public class ExpUmControl {

    static final float MINPASSO = (float) 0.01;//passo minimo
    static final float MAXPASSO = (float) 0.9;//passo maximo
    static final float MINTENSAO = (float) 1.00;//tensao minima
    static final float MAXTENSAO = (float) 3.00;//tensao maxima
    static final float MINCOLUNA = (float) 0.00;//altura minima da coluna
    static final float MAXCOLUNA = (float) 30.00;//altura maxima da coluna

    /**
     * Passo a ser tomado a cada ensaio
     */
    float passo;

    /**
     * Tensão a ser tomada como inicial para inicio de testes
     */
    float tInicial;

    /**
     * Altura limite para realização dos testes
     */
    float altura;

    /**
     * Tempos testados
     */
    Vector times = new Vector();

    /**
     * Valores testes
     */
    Vector values = new Vector();

    public Vector getTimes() {
        return times;
    }

    public void setTimes(Vector tempos) {
        this.times = tempos;
    }

    public Vector getValues() {
        return values;
    }

    public void setValues(Vector valores) {
        this.values = valores;
    }

    public void addValues(float values){
        this.values.add(values);
    }

    public void addTimes(float times){
        this.times.add(times);
    }

    public ExpUmControl() {
        this.passo = (float) 0.00;
        this.tInicial = (float) 0.00;
        this.altura = (float) 0.00;
    }

    public ExpUmControl(float passo, float tInicial, float altura) {
        this.passo = passo;
        this.tInicial = tInicial;
        this.altura = altura;

        if (checkValues(this.passo, this.tInicial, this.altura)) {
            doTest(getPasso(), getAltura(), getTInicial());
        }
    }

    public float getAltura() {
        return altura;
    }

    public void setAltura(float altura) {
        if (inBounds(altura, MINCOLUNA, MAXCOLUNA)) {
            this.altura = altura;
        }
    }

    public float getPasso() {
        return passo;
    }

    public void setPasso(float passo) {
        if (inBounds(passo, MINPASSO, MAXPASSO)) {
            this.passo = passo;
        }
    }

    public float getTInicial() {
        return tInicial;
    }

    public void setTInicial(float tInicial) {
        if (inBounds(tInicial, MINTENSAO, MAXTENSAO)) {
            this.tInicial = tInicial;
        }
    }

    /**
     * Check if all values are bounded
     * @param passo Step of the test
     * @param tInicial Tension applied to the test
     * @param altura  Heigth of the test
     * @return true if all values are according to the bounds
     */
    public boolean checkValues(float passo, float tInicial, float altura) {
        boolean pass = false;
        try {
            if (inBounds(passo, MINPASSO, MAXPASSO)) {
                if (inBounds(tInicial, MINTENSAO, MAXTENSAO)) {
                    if (inBounds(altura, MINCOLUNA, MAXCOLUNA)) {
                        pass = true;
                    }
                }
            }
        } catch (Exception ex) {
            pass = false;
            //JOptionPane.showMessageDialog(this,pass, "Erro na entrada de valores iniciais!", er)
            ex.printStackTrace();
        }
        return pass;
    }

    /**
     * Returns if a value is between the two given values
     * @param valor The value to be analysed
     * @param minValue Minimun value
     * @param maxValue Max value
     * @return true if value is between minValue and maxValue
     */
    public boolean inBounds(float valor, float minValue, float maxValue) {
        boolean pass = false;
        try {
            if (valor >= minValue && valor <= maxValue ) {
                pass = true;
            }
        } catch (Exception ex) {
            pass = false;
            ex.printStackTrace();
        }
        return pass;
    }

    public void doTest(float passo, float coluna, float tensao) {
        //verificar quantos testes fazer
        int quantidadeTestes = (int) ((MAXTENSAO - getTInicial()) / getPasso());

        //Vector valoresTemposTest = new Vector();

        //Vector valoresTensoesTeste = new Vector();
        //valoresTensoesTeste.add(getTInicial());

        String valores = "";

        for (int i = 0; i < quantidadeTestes; i++) {
            this.values.add(getTInicial() + (i * getPasso()));
            valores += " " + getTInicial() + (i * getPasso());
        }
        System.out.println("Valores: " + valores);

        for (int j = 0; j < quantidadeTestes; j++) {
            long tempoInicial = System.currentTimeMillis();

            //thread
            ThreadComunication t = new ThreadComunication();
            //new Thread(t).start();
            Thread tThread = new Thread(t);
            tThread.start();

            while(tThread.isAlive()){
                System.out.println("Counter: "+t.getCounter());
                try{
                    Thread.sleep(100);
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
            System.out.println("Tempo final: "+t.getTempoFinal());
            long tempoFinal = System.currentTimeMillis();

        }

    }
}
